package org.xyl.context;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 上下文组装器 - 负责将融合后的上下文组装成结构化提示词
 */
public class ContextAssembler {
    
    // 日期格式化工具
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    /**
     * 组装上下文为提示词
     */
    public String assemble(FusionResult fusionResult) {
        StringBuilder promptBuilder = new StringBuilder();
        
        // 根据意图选择不同的提示词模板
        UserIntent intent = fusionResult.getIntent();
        
        if (intent == UserIntent.DIAGNOSTIC) {
            assembleDiagnosticPrompt(promptBuilder, fusionResult);
        } else if (intent == UserIntent.SERVICE) {
            assembleServicePrompt(promptBuilder, fusionResult);
        } else {
            assembleDefaultPrompt(promptBuilder, fusionResult);
        }
        
        return promptBuilder.toString();
    }
    
    // 组装诊断场景的提示词
    private void assembleDiagnosticPrompt(StringBuilder promptBuilder, FusionResult fusionResult) {
        // 系统角色
        promptBuilder.append("【系统角色】你是一名资深的物联网故障诊断专家。请根据以下完整的上下文信息，分析设备故障的根本原因，并提供分步排查指南。\n");
        
        // 业务实体上下文
        appendBusinessEntityContext(promptBuilder, fusionResult.getEntityContext());
        
        // 运行时上下文（诊断的关键）
        appendRuntimeContext(promptBuilder, fusionResult.getRuntimeContext());
        
        // 知识上下文
        appendKnowledgeContext(promptBuilder, fusionResult.getKnowledgeContext());
        
        // 用户问题
        promptBuilder.append("【当前问题】")
                    .append(fusionResult.getUserQuery())
                    .append("\n");
        
        // 诊断任务要求
        promptBuilder.append("【诊断任务】请综合分析以上所有信息，判断最可能的原因，并按可能性排序给出行动建议。\n");
    }
    
    // 组装客服场景的提示词
    private void assembleServicePrompt(StringBuilder promptBuilder, FusionResult fusionResult) {
        // 系统角色
        promptBuilder.append("【系统角色】你是一名专业的物联网价签技术支持专家。请严格根据以下知识回答问题。\n");
        
        // 客户信息
        UserRoleContext roleContext = fusionResult.getRoleContext();
        promptBuilder.append("【客户信息】提问者是")
                    .append(roleContext.getUserRole())
                    .append("。\n");
        
        // 知识上下文
        appendKnowledgeContext(promptBuilder, fusionResult.getKnowledgeContext());
        
        // 用户问题
        promptBuilder.append("【当前问题】")
                    .append(fusionResult.getUserQuery())
                    .append("\n");
        
        // 回答要求
        promptBuilder.append("【回答要求】答案需精确，并引用来源。\n");
    }
    
    // 组装默认提示词
    private void assembleDefaultPrompt(StringBuilder promptBuilder, FusionResult fusionResult) {
        // 基本系统角色
        promptBuilder.append("【系统角色】你是一名专业的物联网价签技术支持人员。\n");
        
        // 知识上下文
        appendKnowledgeContext(promptBuilder, fusionResult.getKnowledgeContext());
        
        // 用户问题
        promptBuilder.append("【当前问题】")
                    .append(fusionResult.getUserQuery())
                    .append("\n");
    }
    
    // 添加业务实体上下文
    private void appendBusinessEntityContext(StringBuilder promptBuilder, BusinessEntityContext entityContext) {
        promptBuilder.append("【业务实体上下文】\n");
        
        // 设备信息
        List<BusinessEntityContext.Device> devices = entityContext.getDevices();
        if (!devices.isEmpty()) {
            for (BusinessEntityContext.Device device : devices) {
                promptBuilder.append("设备")
                            .append(device.getDeviceId())
                            .append("：型号")
                            .append(device.getModel())
                            .append("，固件版本")
                            .append(device.getFirmwareVersion());
                
                // 查找对应的客户信息
                String customerName = findCustomerName(entityContext, device.getCustomerId());
                if (customerName != null) {
                    promptBuilder.append("，归属客户\"")
                                .append(customerName)
                                .append("\"");
                }
                promptBuilder.append("。\n");
            }
        }
        
        // 历史工单
        List<BusinessEntityContext.WorkOrder> workOrders = entityContext.getWorkOrders();
        if (!workOrders.isEmpty()) {
            promptBuilder.append("历史工单：");
            for (int i = 0; i < workOrders.size(); i++) {
                BusinessEntityContext.WorkOrder order = workOrders.get(i);
                promptBuilder.append(order.getDescription())
                            .append("（")
                            .append(formatRelativeTime(order.getCreateTime()))
                            .append("前）");
                
                if (i < workOrders.size() - 1) {
                    promptBuilder.append("；");
                }
            }
            promptBuilder.append("\n");
        }
    }
    
    // 添加运行时上下文
    private void appendRuntimeContext(StringBuilder promptBuilder, RuntimeContext runtimeContext) {
        if (runtimeContext == null) return;
        
        promptBuilder.append("【运行时上下文】\n实时状态：");
        
        Map<String, Object> status = runtimeContext.getDeviceStatus();
        if (status.containsKey("batteryVoltage")) {
            promptBuilder.append("电池电压")
                        .append(status.get("batteryVoltage"))
                        .append("V");
        }
        
        if (status.containsKey("signalStrength")) {
            promptBuilder.append("，信号强度")
                        .append(status.get("signalStrength"))
                        .append("dBm");
        }
        
        if (status.containsKey("lastOnlineTime")) {
            long lastOnline = (Long) status.get("lastOnlineTime");
            long hoursAgo = (System.currentTimeMillis() - lastOnline) / (60 * 60 * 1000);
            promptBuilder.append("，最后在线时间")
                        .append(hoursAgo)
                        .append("小时前");
        }
        promptBuilder.append("。\n");
        
        // 最新错误日志
        List<RuntimeContext.LogEntry> logs = runtimeContext.getRecentLogs();
        if (!logs.isEmpty()) {
            promptBuilder.append("最新错误日志：");
            for (int i = 0; i < logs.size() && i < 3; i++) {  // 最多显示3条
                RuntimeContext.LogEntry log = logs.get(i);
                if ("ERROR".equals(log.getLevel())) {
                    promptBuilder.append("[").append(log.getLevel()).append("] ")
                                .append(log.getMessage());
                    break;  // 只显示最新的一条错误日志
                }
            }
            promptBuilder.append("\n");
        }
    }
    
    // 添加知识上下文
    private void appendKnowledgeContext(StringBuilder promptBuilder, KnowledgeContext knowledgeContext) {
        List<KnowledgeContext.KnowledgeItem> items = knowledgeContext.getKnowledgeItems();
        if (!items.isEmpty()) {
            promptBuilder.append("【知识上下文】\n");
            
            for (int i = 0; i < items.size() && i < 5; i++) {  // 最多显示5条
                KnowledgeContext.KnowledgeItem item = items.get(i);
                promptBuilder.append("检索结果")
                            .append(i + 1)
                            .append("：")
                            .append(item.getSource())
                            .append("指出\"")
                            .append(item.getContent())
                            .append("\"");
                
                if (i < items.size() - 1) {
                    promptBuilder.append("\n");
                }
            }
            promptBuilder.append("\n");
        }
    }
    
    // 查找客户名称
    private String findCustomerName(BusinessEntityContext entityContext, String customerId) {
        if (customerId == null) return null;
        
        for (BusinessEntityContext.Customer customer : entityContext.getCustomers()) {
            if (customerId.equals(customer.getCustomerId())) {
                return customer.getName();
            }
        }
        return null;
    }
    
    // 格式化相对时间
    private String formatRelativeTime(Date date) {
        long diff = System.currentTimeMillis() - date.getTime();
        long days = diff / (24 * 60 * 60 * 1000);
        long months = days / 30;
        
        if (months > 0) {
            return months + "个月";
        } else if (days > 0) {
            return days + "天";
        } else {
            long hours = diff / (60 * 60 * 1000);
            return hours + "小时";
        }
    }
}